package logic

import (
	"bluebell/dao/mysql"
	"bluebell/models"
	"database/sql"
	"errors"
	"fmt"
	"go.uber.org/zap"
)

func GetCommunityList() ([]*models.Community, error) {
	// 查数据库 查找到所有的community 并返回
	return mysql.GetCommunityList()
}

func GetCommunityDetail(id int64) (*models.CommunityDetail, error) {
	return mysql.GetCommunityDetailByID(id)
}

func CommunityByName(communityName string) ([]*models.Post, error) {
	id := mysql.GetCommunityIDByName(communityName)
	post, err := mysql.GetPostListByCommunityID(id, 1, 10)
	if err != nil {
		zap.L().Error("CommunityByName mysql.GetPostListByCommunityIDs(id) ", zap.Error(err))
		return nil, err
	}
	return post, err
}

// 获取社区完整帖子列表（带作者信息、社区详情、统计数据）
func GetCommunityPostDetailList(communityID int64, page, size int64) ([]*models.ApiPostDetail, error) {
	// 1. 获取社区基本帖子列表
	basicPosts, err := mysql.GetPostListByCommunityID(communityID, page, size)
	if err != nil {
		return nil, fmt.Errorf("failed to get basic posts: %w", err)
	}

	// 2. 处理每个帖子，添加额外信息
	result := make([]*models.ApiPostDetail, 0, len(basicPosts))

	for _, post := range basicPosts {
		// 获取作者信息
		user, err := mysql.GetUserById(post.AuthorID)
		if err != nil {
			zap.L().Error("failed to get user info",
				zap.Int64("user_id", post.AuthorID),
				zap.Error(err))
			// 跳过错误用户记录
			continue
		}

		// 获取社区详情 - 由于是同一个社区，可以复用之前获取的社区信息
		// 优化：如果社区相同，这里可以缓存社区对象
		community, err := mysql.GetCommunityDetailByID(communityID)
		if err != nil {
			if errors.Is(err, sql.ErrNoRows) {
				return nil, errors.New("community not found")
			}
			zap.L().Error("failed to get community info",
				zap.Int64("community_id", communityID),
				zap.Error(err))
			return nil, fmt.Errorf("failed to get community: %w", err)
		}

		// 获取帖子统计数据
		stats, err := GetPostStats(post.ID)
		if err != nil {
			zap.L().Warn("failed to get post stats",
				zap.Int64("post_id", post.ID),
				zap.Error(err))
			// 使用空数据继续处理
			stats = &models.PostStats{}
		}

		// 组装完整帖子信息
		postDetail := &models.ApiPostDetail{
			AuthorName:      user.Username,
			Post:            post,
			CommunityDetail: community,
			Stats:           stats,
		}

		result = append(result, postDetail)
	}

	return result, nil
}
